package com.rw.tool.util.io.file.json;

import com.rw.tool.util.io.FileIOUtil;
import com.rw.tool.util.io.exception.StreamIOException;
import com.rw.tool.util.io.file.FileDB;
import com.rw.tool.util.io.file.property.NewInstance;
import com.rw.tool.util.json.JsonUtil;

import java.io.File;

/**
 * 使用json序列化实现的FileDB
 * 可以让javabean方便的和文件进行交互
 *
 * @param <T> javabean类型
 */
public class JsonFileDB<T> extends FileDB<T> {
    /**
     * 构造JsonFileDB
     *
     * @param workPath       工作目录
     * @param tClass         javabean的类对象
     * @param jsonBeanParser javabean的属性解析器
     */
    public JsonFileDB(File workPath, Class<T> tClass, JsonBeanParser<T> jsonBeanParser) {
        super(workPath, tClass, jsonBeanParser);
    }

    /**
     * 构造JsonFileDB
     *
     * @param tClass         javabean的类对象
     * @param jsonBeanParser javabean的属性解析器
     */
    public JsonFileDB(Class<T> tClass, JsonBeanParser<T> jsonBeanParser) {
        super(tClass, jsonBeanParser);
    }

    /**
     * 构造JsonFileDB
     *
     * @param workPath 工作目录
     * @param tClass   javabean的类对象
     */
    public JsonFileDB(File workPath, Class<T> tClass) {
        super(workPath, tClass, new JsonBeanParser<>());
    }

    /**
     * 构造JsonFileDB
     *
     * @param tClass javabean的类对象
     */
    public JsonFileDB(Class<T> tClass) {
        super(tClass, new JsonBeanParser<>());
    }

    /**
     * 构造JsonFileDB
     *
     * @param workPath       工作目录
     * @param tClass         javabean的类对象
     * @param jsonBeanParser javabean的属性解析器
     * @param newInstance    javabean的new对象方法
     */
    public JsonFileDB(File workPath, Class<T> tClass, JsonBeanParser<T> jsonBeanParser, NewInstance<T> newInstance) {
        super(workPath, tClass, jsonBeanParser, newInstance);
    }


    /**
     * 构造JsonFileDB
     *
     * @param tClass         javabean的类对象
     * @param jsonBeanParser javabean的属性解析器
     * @param newInstance    javabean的new对象方法
     */
    public JsonFileDB(Class<T> tClass, JsonBeanParser<T> jsonBeanParser, NewInstance<T> newInstance) {
        super(tClass, jsonBeanParser, newInstance);
    }


    /**
     * 构造JsonFileDB
     *
     * @param workPath    工作目录
     * @param tClass      javabean的类对象
     * @param newInstance javabean的new对象方法
     */
    public JsonFileDB(File workPath, Class<T> tClass, NewInstance<T> newInstance) {
        super(workPath, tClass, new JsonBeanParser<>(), newInstance);
    }


    /**
     * 构造JsonFileDB
     *
     * @param tClass      javabean的类对象
     * @param newInstance javabean的new对象方法
     */
    public JsonFileDB(Class<T> tClass, NewInstance<T> newInstance) {
        super(tClass, new JsonBeanParser<>(), newInstance);
    }


    /**
     * 额外的后缀
     *
     * @return 额外的后缀
     */
    @Override
    public String extraSuffix() {
        return "json";
    }

    /**
     * 根据file，反编译变成对象
     *
     * @param file 文件对象
     * @return 对象类型
     */
    @Override
    public T getBean(File file) {
        try {
            String json = FileIOUtil.readFile(file);
            return JsonUtil.toObject(json, tClass);
        } catch (StreamIOException e) {
            return null;
        }
    }

    /**
     * 把bean设置进文件
     *
     * @param file 文件对象
     * @param bean 对象
     */
    @Override
    public void setBean(File file, T bean) {
        FileIOUtil.writeFile(file, JsonUtil.toJson(bean));
    }
}
